import axios, { AxiosProxyConfig } from 'axios'
import{start,close} from '../util/nprogress'

//基本路径 每个请求都会带着这个请求
/**
 * AxiosInstance    axios实例
 * 
 */
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
type Result<T> = {
    code: number;
    message: string;
    result: T;
};
//导出Request类，可以用来自定义传递配置来创建实例
export class Request {
    //  axios实例
    instance: AxiosInstance;
    baseConfig: AxiosRequestConfig = { baseURL: "/api", timeout: 60000 };
    constructor(config: AxiosRequestConfig) {
       
        this.instance = axios.create(Object.assign(this.baseConfig, config));
        //封装请求头
        this.instance.interceptors.request.use(
            (config: AxiosRequestConfig) => {
                // 一般会请求拦截里面加token，用于后端的验证
                const token = <string>localStorage.getItem("token");
                config.headers!["Content-Type"]="multipart/form-data"
                if (token) config.headers!.Token = token
                start()
                return config
            },
            (error: any) => {
                // 请求错误，这里可以用全局提示框进行提示
                return Promise.reject(error)
            }
        )
        this.instance.interceptors.response.use(
            (res: AxiosResponse) => {
                // 直接返回res，当然你也可以只返回res.data
                // 系统如果有自定义code也可以在这里处理
                close()
                return res
            },
            (err: any) => {
                let message = ""
                switch (err.response.status) {
                    case 400:
                        message = "请求错误(400)";
                        break;
                    case 403:
                        message = "拒绝访问(403)";
                        break;
                    case 404:
                        message = "请求出错(404)";
                        break;
                    case 408:
                        message = "请求超时(408)";
                        break;
                    case 500:
                        message = "服务器错误(500)";
                        break;
                    case 501:
                        message = "服务未实现(501)";
                        break;
                    case 502:
                        message = "网络错误(502)";
                        break;
                    case 503:
                        message = "服务不可用(503)";
                        break;
                    case 504:
                        message = "网络超时(504)";
                        break;
                    case 505:
                        message = "HTTP版本不受支持(505)";
                        break;
                    default:
                        message = `连接出错(${err.response.status})!`;
                }
                return Promise.reject(err.reponse);
            }
        )
    }
    //定义请求方法
    public request(config:AxiosRequestConfig):Promise<AxiosResponse>{
        return this.instance.request(config)
        
    }
    //封装get方法
    public get<T=any>(url:string,config?:AxiosRequestConfig):Promise<AxiosResponse<Result<T>>>{
        return this.instance.get(url,config)
    }
    //post
    public post<T=any>(url:string,data?:any,config?:AxiosRequestConfig):Promise<AxiosResponse<Result<T>>>{
        return this.instance.post(url,data,config)
    }
    //put
    public put<T=any>(url:string,data?:any,config?:AxiosProxyConfig):Promise<AxiosResponse<Result<T>>>{
        return this.instance.put(url,data,config)
    }
    //delete
    public delete<T=any>(url:string,config?:AxiosRequestConfig):Promise<AxiosResponse<Result<T>>>{
        return this.instance.delete(url,config)
    }
}